/*
题目背景
B 地区在地震过后，所有村庄都造成了一定的损毁，而这场地震却没对公路造成什么影响。但是在村庄重建好之前，所有与未重建完成的村庄的公路均无法通车。
换句话说，只有连接着两个重建完成的村庄的公路才能通车，只能到达重建完成的村庄。

题目描述
给出 B 地区的村庄数 N，村庄编号从 0 到 N−1，和所有 M 条公路的长度，公路是双向的。并给出第 i 个村庄重建完成的时间 ti，你可以认为是同时开始重建并在第ti
​天重建完成，并且在当天即可通车。若 ti为 0 则说明地震未对此地区造成损坏，一开始就可以通车。之后有 Q 个询问 (x,y,t)，对于每个询问你要回答在第 t 天，从村庄 x 到村庄 y 的最短路径长度为多少。如果无法找到从 x 村庄到 y 村庄的路径，经过若干个已重建完成的村庄，或者村庄 x 或村庄 y 在第 t 天仍未重建完成，则需要输出 −1。

输入格式
第一行包含两个正整数 N,M，表示了村庄的数目与公路的数量。
第二行包含 N 个非负整数 t 0,t 1,⋯,t N−1，表示了每个村庄重建完成的时间，数据保证了 t 0≤t 1≤⋯≤t N−1。
接下来 M 行，每行 3 个非负整数 i,j,w，w 不超过 10000，表示了有一条连接村庄 i 与村庄 j 的道路，长度为 w，保证 i!=j，且对于任意一对村庄只会存在一条道路。
接下来一行也就是 M+3 行包含一个正整数 Q，表示 Q 个询问。
接下来 Q 行，每行 3 个非负整数 x,y,t，询问在第 t 天，从村庄 x 到村庄 y 的最短路径长度为多少，数据保证了 t 是不下降的。
输出格式
共 Q 行，对每一个询问 (x,y,t) 输出对应的答案，即在第 t 天，从村庄 x 到村庄 y 的最短路径长度为多少。如果在第 t 天无法找到从 x 村庄到 y 村庄的路径，经过若干个已重建完成的村庄，或者村庄 x 或村庄 y 在第 t 天仍未修复完成，则输出 −1。
*/

#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
#define all(rq) rq.begin(),rq.end()
#define max(a,b) (a<b?b:a)
#define min(a,b) (a<b?a:b)

using namespace std;
const int INF=0x3f3f3f3f;
void update(int k,vector<vector<int>>& graph,int n){ //通过弗洛伊德算法只更新已经重建好的村庄
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(i!=j&&graph[i][j]>graph[i][k]+graph[k][j]){
				graph[i][j]=graph[i][k]+graph[k][j];
			}
		}
	}
	
	return;
}

int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n,m;
	cin>>n>>m;
	vector<int> t(n);
	for(int i=0;i<n;i++){
		cin>>t[i];
	}
	
	vector<vector<int>> graph(n,vector<int>(n,INF));
	for(int i=0;i<m;i++){
		int x,y,w;
		cin>>x>>y>>w;
		graph[x][y]=graph[y][x]=w; //无向边
	}
	
	for(int i=0;i<n;i++){
		graph[i][i]=0;
	}
	
	int q;
	cin>>q;
	int now=0;
	for(int i=0;i<q;i++){
		int x,y,time;
		cin>>x>>y>>time;
		
		while(t[now]<=time&&now<n){
			update(now,graph,n);
			now++;
		}
		
		if(t[x]>time||t[y]>time) cout<<-1<<endl;
		else{
			if(graph[x][y]==INF) cout<<-1<<endl;
			else{
				cout<<graph[x][y]<<endl;
			}
		}
	}
	return 0;
}